#include <iostream>

class Test
{
public:
    // 初始化列表:1、常成员变量只能在初始化列表中进行初始化赋值
    // 2、括号外的一定是成员变量，括号内的一定是形参    
    // 3、引用成员也必须要在初始化列表中初始化
    Test(int b,double c):a(10),b(b),c(c),d(b)
    {
    }
    void show()
    {
        std::cout<<a<<std::endl;
    }
    //const 修饰函数
    //1.修饰返回值
    const Test& get()  //防止返回的引用对原对象的修改
    {
        return *this;
    }

    //2.修饰形参
    void func(const Test& t)  // 保护传入的引用修改原对象
    {
    }

    // void func()const //常成员函数：不能对对象的成员变量进行任何修改(只限制自己的变量)
    // {
    //     // b++; //不能
    // }

    const Test& func(const Test &t)const  //返回值 传入参数 成员变量都不能修改 
    {
        return t;
    }

private:
    const int a;   //常成员变量
    int &d;   //引用成员
    int b;    
    double c;
};

int main()
{
    Test t(1,3.14);
    const Test&a = t.get();
    // t.show();
    return 0;
}
